﻿using System.Data;
using System;
using Negocio.View.Base;
using System.Runtime.CompilerServices;
using Negocio.Generico;
using System.ServiceModel;

namespace Negocio.View
{

    /// <summary>
    /// View de las personas
    /// </summary>
    public class PersonaView : ViewBase
    {
        #region Singleton

        private static PersonaView instance = null;

        private PersonaView()
        {
            //Vacio
        }

        [MethodImpl(MethodImplOptions.Synchronized)]
        public static PersonaView GetInstance()
        {
            if (instance == null)
            {
                instance = new PersonaView();
            }
            return instance;
        }

        #endregion

        #region Constantes

        /// <summary>
        /// Codigo de la persona
        /// </summary>
        private const string CODIGOPERSONA = "CODIGOPERSONA";

        /// <summary>
        /// Aficiones de la persona
        /// </summary>
        private const string AFICIONES = "AFICIONES";

        /// <summary>
        /// Frase de la persona
        /// </summary>
        private const string FRASE = "FRASE";

        /// <summary>
        /// Campo propio de la persona
        /// </summary>
        private const string PROPIO = "PROPIO";

        /// <summary>
        /// Codigo del nivel
        /// </summary>
        private const string CODIGONIVEL = "CODIGONIVEL";

        /// <summary>
        /// Nick de la persona
        /// </summary>
        private const string NICK = "NICK";

        /// <summary>
        /// Ultima conexion de la persona
        /// </summary>
        private const string ULTIMA_CONEXION = "ULTIMACONEXION";

        /// <summary>
        /// Imagen de la persona(Avatar)
        /// </summary>
        private const string IMAGEN = "IMAGEN";

        /// <summary>
        /// Userhash para la codificacion de la seguridad
        /// </summary>
        private const string USERHASH = "USERHASH";

        /// <summary>
        /// Nombre del usuario
        /// </summary>
        private const string NOMBRE = "NOMBRE";

        /// <summary>
        /// Apellido 1 de la persona
        /// </summary>
        private const string APELLIDO1 = "APELLIDO1";

        /// <summary>
        /// Apellido 2 de la persona
        /// </summary>
        private const string APELLIDO2 = "APELLIDO2";

        /// <summary>
        /// Correo electrónico
        /// </summary>
        private const string EMAIL = "EMAIL";


        /// <summary>
        /// Fecha de nacimiento
        /// </summary>
        private const string FECHANACIMIENTO = "FECHANACIMIENTO";


        /// <summary>
        /// DNI del usuario
        /// </summary>
        private const string DNI = "DNI";


        /// <summary>
        /// esadministrador
        /// </summary>
        private const string ESADMINISTRADOR = "ESADMINISTRADOR";

        /// <summary>
        /// Nombre de la imagen asociada al usuario
        /// </summary>
        private const string NOMBREIMAGEN = "NOMBREIMAGEN";

        /// <summary>
        /// Codigo del alumno
        /// </summary>
        private const string CODIGOALUMNO = "CODIGOALUMNO";


        #endregion

        #region View

        /// <summary>
        /// Muestra un DataView de personas
        /// </summary>
        /// <returns>DataView con todos los datos</returns>
        public DataView GetViewPersonas(PersonaDTO filtro)
        {
            try
            {

               
                DataView dv = new DataView();
                DataTable dt = new DataTable("Personas");

                dt.Columns.Add(PersonaView.CODIGOPERSONA, this.GetTypeInt32);
                dt.Columns.Add(PersonaView.AFICIONES, this.GetTypeString);
                dt.Columns.Add(PersonaView.FRASE, this.GetTypeString);
                dt.Columns.Add(PersonaView.PROPIO, this.GetTypeString);
                //dt.Columns.Add(PersonaView.CODIGONIVEL, this.GetTypeInt32);
                dt.Columns.Add(PersonaView.NICK, this.GetTypeString);
                dt.Columns.Add(PersonaView.ULTIMA_CONEXION, this.GetTypeSqlDateTime);
                dt.Columns.Add(PersonaView.IMAGEN, this.GetTypeByteArray);
                dt.Columns.Add(PersonaView.USERHASH, this.GetTypeString);
                dt.Columns.Add(PersonaView.NOMBRE, this.GetTypeString);
                dt.Columns.Add(PersonaView.APELLIDO1, this.GetTypeString);
                dt.Columns.Add(PersonaView.APELLIDO2, this.GetTypeString);
                dt.Columns.Add(PersonaView.EMAIL, this.GetTypeString);
                dt.Columns.Add(PersonaView.FECHANACIMIENTO, this.GetTypeSqlDateTime);
                dt.Columns.Add(PersonaView.DNI, this.GetTypeString);
                dt.Columns.Add(PersonaView.ESADMINISTRADOR, this.GetTypeInt32);
                dt.Columns.Add(PersonaView.NOMBREIMAGEN, this.GetTypeString);
                dt.Columns.Add(PersonaView.CODIGOALUMNO, this.GetTypeInt32);
                using (Negocio.Generico.ContratoGenericoClient servicio = new Negocio.Generico.ContratoGenericoClient())
                {
                    if (servicio.State == CommunicationState.Faulted)
                    {
                        throw new Exception("Problema al instanciarlo");
                    }

                    foreach (PersonaDTO bean in servicio.Get(filtro))
                    {
                        DataRow fila = dt.NewRow();

                        fila[PersonaView.CODIGOPERSONA] = bean.CoPersona;
                        fila[PersonaView.AFICIONES] = bean.Aficiones;
                        fila[PersonaView.FRASE] = bean.Frase.ToString();
                        fila[PersonaView.PROPIO] = bean.Propio;
                        //fila[PersonaView.CODIGONIVEL] = bean.Nivel;
                        fila[PersonaView.NICK] = bean.Nick;
                        fila[PersonaView.ULTIMA_CONEXION] = bean.UltimaConexion;
                        fila[PersonaView.IMAGEN] = bean.Imagen;
                        fila[PersonaView.USERHASH] = bean.Userhash;
                        fila[PersonaView.NOMBRE] = bean.Nombre;
                        fila[PersonaView.APELLIDO1] = bean.Apellido1;
                        fila[PersonaView.APELLIDO2] = bean.Apellido2;
                        fila[PersonaView.EMAIL] = bean.Email;
                        fila[PersonaView.FECHANACIMIENTO] = bean.FechaNacimiento;
                        fila[PersonaView.DNI] = bean.Dni;
                        fila[PersonaView.ESADMINISTRADOR] = bean.EsAdministrador;
                        fila[PersonaView.NOMBREIMAGEN] = bean.NombreImagen;
                        fila[PersonaView.CODIGOALUMNO] = bean.CoAlumno;
                        dt.Rows.Add(fila);
                    }
                }
                return dt.DefaultView;
            }
            catch (Exception ex)
            {
                throw new ViewException(ex);
            }
        }

        public DataTable GetDataTablePersonas(PersonaDTO filtro)
        {
            return this.GetViewPersonas(filtro).Table;
        }
        #endregion
    }
}